package com.arpa.wms.mapper;

import com.arpa.wms.domain.dto.InventoryOperationDto;
import com.arpa.wms.domain.dto.OutboundItemDTO;
import com.arpa.wms.domain.dto.RecheckItemOperationDto;
import com.arpa.wms.domain.entity.OutboundItem;
import com.arpa.wms.domain.vo.OutboundItemVO;
import com.arpa.wms.domain.vo.OutboundItemWithRegisterVO;
import com.arpa.wms.domain.vo.OutboundVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 出库单明细 Mapper 接口
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface OutboundItemMapper extends BaseMapper<OutboundItem> {

    /**
     * 查询列表
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryList(OutboundItemDTO outboundItemDTO);

    /**
     * 查询合计,包含总数
     * @param outboundItemDTO
     * @return
     */
    OutboundItemVO queryListSum(OutboundItemDTO outboundItemDTO);

    /**
     * 查询所有
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryAll(OutboundItemDTO outboundItemDTO);

    /**
     * @description
     * 查询明细与确认单关联的列表
     * @author xuyang
     * @date 2020/10/27 14:33
     * @param outboundItemDTO:
     **/
    List<OutboundItemWithRegisterVO> queryItemWithRegisterList(OutboundItemDTO outboundItemDTO);

    /**
     * @param itemCode :
     * @param status   :
     * @description 根据拣货量与复核量+退减量的比较，尝试更新明细的状态
     * @author xuyang
     * @date 2020/10/29 8:55
     **/
    int updateStatusIfFinishRecheck(@Param("code") String itemCode, @Param("status") String status,@Param("groupCode")String groupCode);

    /**
     * @param itemCode :
     * @param stockoutQuantity :
     * @description 尝试更新明细中的缺货数量，如果计划数量 < 已复核数量+已维护缺货数量+新缺货数量，则不更新
     * @author xuyang
     * @date 2020/10/29 10:24
     **/
    int updateStockout(@Param("code") String itemCode, @Param("stockoutQuantity") BigDecimal stockoutQuantity);

    /**
     * 根据分配单出库数量更新出库明细的出库数量
     * @param outboundCode
     * @param wavePickingCode
     * @return
     */
    int updateOutQuantityByDistribution(@Param("outboundCode") String outboundCode, @Param("wavePickingCode") String wavePickingCode,@Param("groupCode")String groupCode);

    /**
     * 分组查询出库明细
     * @param outboundItemDTO
     * @return
     * @return
     */
    OutboundItemVO queryQuantityGroupByBarCode(OutboundItemDTO outboundItemDTO);


    /**
     * 更新复核数量
     * @author liuxr
     * @date 2021/4/12 18:45
     * @param outboundCode 出库单号
     * @param oldInventoryCode 原库存code
     * @param reviewCount 复核数量
     * @return int 更新条数
     */
    int generalReviewUpdateInfo(@Param("outboundCode") String outboundCode,@Param("oldInventoryCode") String oldInventoryCode,@Param("reviewCount")  BigDecimal reviewCount);

    /**
     * 根据出库登记表的复核数量更新出库明细复核数量和状态
     * @author rfwang
     * @date 2021/5/21 12:13
     * @param outboundCode 出库单号
     */
    int updateRecheckQuantity(@Param("outboundCode") String outboundCode,@Param("groupCode")String groupCode);

    void deliveryCancelUpdataQuantity(@Param("wavePickingCode") String wavePickingCode, @Param("allQuantityList") List<InventoryOperationDto> allQuantityList,@Param("groupCode")String groupCode);

    /**
     * 根据波次号和状态查询列表
     * @param outboundItemDTO
     * @return
     */
    List<OutboundItemVO> queryListGroupByWavePickingCodeAndStatus(OutboundItemDTO outboundItemDTO);

    /**
     * 根据出库登记表的复核数量更新出库明细复核数量和状态
     * @author rfwang
     * @date 2021年7月16日
     * @param wavePickingCode 波次号
     */
    int updateRecheckQuantityByWavePickingCode(@Param("wavePickingCode")String wavePickingCode,@Param("groupCode")String groupCode);

    /**
     * 批量更新复核数量
     * @author rfwang
     * @date 2021/12/20 20:12
     * @param recheckItemOperationDtoList
     * @return
     */
    void batchRecheck(List<RecheckItemOperationDto> recheckItemOperationDtoList);

    /**
     * 汇总波次号下复核完成的商品数量
     *
     * @param codes 波次号
     */
    List<OutboundItemVO> querySumGroupByGoods(@Param("codes")List<String> codes,@Param("groupCode") String groupCode);

}
